/*
 * nmcom.c
 *
 *  Created on: Feb 9, 2010
 *      Author: Marco Luisi
 */


#include "nmcom.h"

// fare il controllo sulla receive fuori....
//spostare gli error check dalla libreria al programma?
int receive(int ch, message_t *msg) { // meglio passare il riferimento a message?

	int rd; //usarlo in qualche modo?
	int len;
	int i;
	int tmp;
	//setup iniziale del messaggio
	EC_M1(read(ch, &(msg->cmdcode), sizeof(int)));
	EC_M1(read(ch, &(msg->argnum), sizeof(int)));
	EC_M1(read(ch, &(msg->nnum), sizeof(int)));

	//lettura eventuali argomenti
	if (msg->argnum) {
		EC_NULL(msg->args = malloc(msg->argnum * sizeof(char*)));
		//salvarsi i limiti per evitare ogni volta di fare 2 accessi?

		for(i = 0; i < msg->argnum; i++) {
			EC_M1(read(ch,&len,sizeof(int))); //leggo la lunghezza della stringa da leggere
			EC_NULL(msg->args[i] = malloc(len * sizeof(char *))); //char o char*?
			EC_M1(read(ch, msg->args[i], len)); // lettura stringa
		}

	}

	//lettura eventuali numeri
	if (msg->nnum) {
		EC_NULL(msg->numbers = malloc(msg->nnum * sizeof(double)));
		for(i = 0; i < msg->nnum; i++){
			EC_M1(read(ch, &(msg->numbers[i]), sizeof(double)));
		}


	}
	return msg->cmdcode;//ok?

}


int send(int ch, message_t *msg) {

	int i;
	int len;
	//invio dei parametri del messaggio
	EC_M1(write(ch,&(msg->cmdcode),sizeof(int)));
	EC_M1(write(ch,&(msg->argnum),sizeof(int)));
	EC_M1(write(ch,&(msg->nnum),sizeof(int)));

	//invio degli argomenti del messaggio
	if(msg->argnum) {
		for(i = 0; i < msg->argnum; i++){
			len = strlen(msg->args[i]);
			EC_M1(write(ch,&len,sizeof(int)));
			EC_M1(write(ch,msg->args[i],sizeof(char)));

		}

		//invio dei numeri nel messaggio
		for(i = 0; i < msg->nnum; i ++) {
			EC_M1(write(ch,&(msg->numbers[i]),sizeof(double)));
		}

	}

	return 1;
}

//poi togliere
void msgprint(message_t *m) { //fare una print generica in un util.h o print.h !!!
	int i;
	printf("Debug MSGPRINT:\n");
	if (&m != NULL) {
		printf("cmdcode= %d || argnum= %d || nnum= %d\n", m->cmdcode, m->argnum,
				m->nnum);
		if (m->argnum) {
			for (i = 0; i < m->argnum; i++) {
				printf("arg[%d]=%s\n", i, m->args[i]);
			}
		}
		if (m->nnum) {
			for (i = 0; i < m->nnum; i++) {
				printf("num[%d]=%g\n", i, m->numbers[i]);
			}
		}

	}

}//fine msgprint
